package com.burns.svg.demo;/**
 * Created by burns.
 *
 * @author <a href="http://www.esoon-soft.com/">burns</a>
 * @date 2021/04/25 15:12
 */

/**
 * TODO
 *
 * @ClassName T
 * @Author Burns
 * @DAte 2021/4/25 15:12
 */
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;

import org.apache.batik.bridge.Window;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.svg.SVGLoadEventDispatcherAdapter;
import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;

public class SVGApplicationT {
    public static void main(String[] args) {
        new SVGApplicationT();
    }

    JFrame frame;
    JSVGCanvas canvas;
    Document document;
    Window window;

    public SVGApplicationT() {
        frame = new JFrame();
        canvas = new JSVGCanvas();
        // Forces the canvas to always be dynamic even if the current
        // document does not contain scripting or animation.
        canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
        canvas.addSVGLoadEventDispatcherListener
                (new SVGLoadEventDispatcherAdapter() {
                    @Override
                    public void svgLoadEventDispatchStarted
                            (SVGLoadEventDispatcherEvent e) {
                        // At this time the document is available...
                        document = canvas.getSVGDocument();
                        // ...and the window object too.
//                        window = canvas.getUpdateManager().
//                                getScriptingEnvironment().createWindow(null,null);
                        // Registers the listeners on the document
                        // just before the SVGLoad event is dispatched.
                        registerListeners();
                        // It is time to pack the frame.
                        frame.pack();
                    }
                });
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent e) {
                // The canvas is ready to load the base document
                // now, from the AWT thread.
                canvas.setURI("doc.svg");
            }
        });
        frame.getContentPane().add(canvas);
        frame.setSize(800, 600);
        frame.show();
    }

    public void registerListeners() {
        // Gets an element from the loaded document.
        Element elt = document.getElementById("elt-id");
        EventTarget t = (EventTarget)elt;
        // Adds a 'onload' listener
        t.addEventListener("SVGLoad", new OnLoadAction(), false);
        // Adds a 'onclick' listener
        t.addEventListener("click", new OnClickAction(), false);
    }

    public class OnLoadAction implements EventListener {
        @Override
        public void handleEvent(Event evt) {
            // Make some actions here...
            // ... for example start an animation loop:
            window.setInterval(new Animation(), 50);
        }
    }

    public class OnClickAction implements EventListener {
        @Override
        public void handleEvent(Event evt) {
            // Make some actions here...
            // ... for example schedule an action for later:
            window.setTimeout(new DelayedTask(), 500);
        }
    }

    public class Animation implements Runnable {
        @Override
        public void run() {
            // Insert animation code here...
        }
    }

    public class DelayedTask implements Runnable {
        @Override
        public void run() {
            // Make some actions here...
            // ... for example displays an alert dialog:
            window.alert("Delayed Action invoked!");
        }
    }
}

